1 Loading Library and Reading the Data

library(tidyverse)
library(readxl)
library(plotly)

CAP_FINAL <- read_excel("Downloads/Nutrition__Physical_Activity__and_Obesity_-_Behavioral_Risk_Factor_Surveillance_System.xlsx")

head(CAP_FINAL)

1.1 Filtering Questions, Ages, and Gender

All_Ages1 <- CAP_FINAL %>%
  filter(Question == "Percent of adults who engage in muscle-strengthening activities on 2 or more days a week") %>%
  filter(`Age(years)` %in% c("18 - 24", "25 - 34", "35 - 44"))
All_Ages1

1.2 Filtering Questions, Ages, and Gender

All_Gender1 <- CAP_FINAL %>%
  filter(Question == "Percent of adults who engage in muscle-strengthening activities on 2 or more days a week") %>%
  filter(`Gender` %in% c("Female", "Male"))
All_Gender1

1.3 Filtering Questions

Q <- CAP_FINAL %>%
  filter(Question %in% c("Percent of adults who engage in muscle-strengthening activities on 2 or more days a week", "Percent of adults who achieve at least 150 minutes a week of moderate-intensity aerobic physical activity or 75 minutes a week of vigorous-intensity aerobic activity (or an equivalent combination)", "Percent of adults who achieve at least 300 minutes a week of moderate-intensity aerobic physical activity or 150 minutes a week of vigorous-intensity aerobic activity (or an equivalent combination)", "Percent of adults who engage in no leisure-time physical activity"))
Q

1.4 Filtering Question 1 and Educational levels

Q1 <- CAP_FINAL %>%
  filter(Question == "Percent of adults who engage in muscle-strengthening activities on 2 or more days a week") %>%
  filter(`Education` %in% c("Less than high school", "High school graduate", "Some college or technical school", "College graduate"))
Q1

1.5 Filtering Question 2 and Educational levels

Q2 <- CAP_FINAL %>%
  filter(Question == "Percent of adults who achieve at least 150 minutes a week of moderate-intensity aerobic physical activity or 75 minutes a week of vigorous-intensity aerobic activity (or an equivalent combination)") %>%
  filter(`Education` %in% c("Less than high school", "High school graduate", "Some college or technical school", "College graduate"))
Q2
NA

1.6 Filtering Question 3 and Educational levels

Q3 <- CAP_FINAL %>%
  filter(Question == "Percent of adults who achieve at least 300 minutes a week of moderate-intensity aerobic physical activity or 150 minutes a week of vigorous-intensity aerobic activity (or an equivalent combination)") %>%
  filter(`Education` %in% c("Less than high school", "High school graduate", "Some college or technical school", "College graduate"))
Q3

1.7 Filtering Question 4 and Educational levels

Q4 <- CAP_FINAL %>%
  filter(Question == "Percent of adults who engage in no leisure-time physical activity") %>%
  filter(`Education` %in% c("Less than high school", "High school graduate", "Some college or technical school", "College graduate"))
Q4

2 Comparing each Question, Percentage (Data Value), and Sample Size

ggplot(Q, aes(x= str_wrap(`Question`, width = 10), y=`Data_Value`, fill = `Sample_Size`)) + 
  geom_bar(stat = "identity") +  theme(legend.position="right") +
  xlab("Question") + ylab("Percentage") + ggtitle("Comparing All Educational Levels, Percentage, and Sample Size")

              
ggplotly(tooltip = c("y", "fill"))
Removed 29 rows containing missing values (position_stack).

2.1 Comparing Question 1, Educational Levels, Percentage (Data Value), and Sample Size

ggplot(Q1, aes(x= str_wrap(`Education`, width = 10), y=`Data_Value`, fill = `Sample_Size`)) + 
  geom_bar(stat = "identity") +  theme(legend.position="right") +
  xlab("Education") + ylab("Percentage") + ggtitle("Comparing Educational Levels, Percentage, and Sample Size")

              
ggplotly(tooltip = c("y", "fill"))

2.1.1 Comparing Question 1, Educational Levels, Percentage (Data Value), and Sample Size

ggplot(All_Gender1, aes(x= `Sample_Size`, y=`Data_Value`, fill = `Question`)) + 
  geom_bar(stat = "identity") +  theme(legend.position="top",
              axis.text = element_text(angle = 10, vjust = 0.6)) +
  xlab("Sample Size") + ylab("Percentage") + ggtitle("Percent of adults who engage in muscle-strengthening activities")

ggplotly()

2.2 Comparing Question 2, Educational Levels, Percentage (Data Value), and Sample Size

ggplot(Q2, aes(x= str_wrap(`Education`, width = 10), y=`Data_Value`, fill = `Sample_Size`)) + 
  geom_bar(stat = "identity") +  theme(legend.position="right") +
  xlab("Education") + ylab("Percentage") + ggtitle("Comparing Educational Levels, Percentage, and Sample Size")

              
ggplotly(tooltip = c("y", "fill"))

2.3 Comparing Question 3, Educational Levels, Percentage (Data Value), and Sample Size

ggplot(Q3, aes(x= str_wrap(`Education`, width = 10), y=`Data_Value`, fill = `Sample_Size`)) + 
  geom_bar(stat = "identity") +  theme(legend.position="right") +
  xlab("Education") + ylab("Percentage") + ggtitle("Comparing Educational Levels, Percentage, and Sample Size")

              
ggplotly(tooltip = c("y", "fill"))

2.4 Comparing Question 4, Educational Levels, Percentage (Data Value), and Sample Size

ggplot(Q4, aes(x= str_wrap(`Education`, width = 10), y=`Data_Value`, fill = `Sample_Size`)) + 
  geom_bar(stat = "identity") +  theme(legend.position="right") +
  xlab("Education") + ylab("Percentage") + ggtitle("Comparing Educational Levels, Percentage, and Sample Size")

              
ggplotly(tooltip = c("y", "fill"))

3 Combining Aggregared Data

3.1 All Ages

All_Ages <- CAP_FINAL %>% 
  filter(`Age(years)` %in% c("18 - 24", "25 - 34", "35 - 44", "45 - 54", "55 - 64", "65 or older"))
head(All_Ages)

3.2 All Education

All_Edu <- CAP_FINAL %>%
  filter(`Education` %in% c("Less than high school", "High school graduate", "Some college or technical school", "College graduate"))
head(All_Edu)

3.3 All Gender

All_Gender <- CAP_FINAL %>%
  filter(`Gender` %in% c("Female", "Male"))
head(All_Gender)

3.4 All Income

All_Income <- CAP_FINAL %>%
  filter(`Income` %in% c("Less than $15,000", "$15,000 - $24,999", "$25,000 - $34,999", "$35,000 - $49,999", "$50,000 - $74,999", "$75,000 or greater"))
head(All_Income)

3.5 All Race/Ethnicity

All_Races <- CAP_FINAL %>%
  filter(`Race/Ethnicity` %in% c("American Indian/Alaska Native", "Asian", "Hawaiian/Pacific Islander", "Non-Hispanic Black", "Non-Hispanic White", "Hispanic", "2 or more races"))
head(All_Races)

3.6 Age 18-24

Age <- CAP_FINAL %>%
  filter(`Age(years)` %in% "18 - 24")
head(Age)

4 Visualization for All Ages

4.1 Boxplot for All Ages

ggplot(data = All_Ages, 
       aes(x=reorder(`Age(years)`, `Data_Value`), y=`Data_Value`, fill=`Sample_Size`, color = "Age(years)")) + 
  geom_boxplot() + xlab("Age(years)") + ylab("Percentage") +
  theme(legend.position="top") + ggtitle("Boxplot for All Ages")

ggplotly()

4.2 All Ages and Sample Size

j1 <- ggplot(data = All_Ages, 
  aes(x = `Age(years)`, y = Data_Value, color = `Sample_Size`)) +
  geom_point(stat = "Identity", fill = "#532d8e") + 
  xlab("Age(years)") + ylab("Percentage") + ggtitle("Comparing All Ages and Sample Size")
j1

ggplotly(j1)

5 Data Analysis and Visualization

5.1 Comparing Income, Data Value, and Sample Size

j3 <- ggplot(All_Income,
             aes(x = Income,
                 y = Sample_Size)) + 
        theme(legend.position="right",
              axis.text = element_text(angle = 20, vjust = 0.6))
(j4 <- j3 + geom_point(aes(color = Data_Value),
                       alpha = 0.5,
                       size = 1.5,
                       position = position_jitter(width = 0.25, height = 0)))

j4 +
  scale_x_discrete(name="Income") +
  scale_color_continuous(name="",
                         breaks = c(10, 40, 60),
                         labels = c("10", "40", "60"),
                         low = "blue", high = "red") +      ggtitle("Comparing Income and Sample Size")

ggplotly()

5.2 Comparing Gender, Data value, and Sample Size

j2 <- ggplot(All_Gender,
             aes(x = Gender,
                 y = Sample_Size)) + 
        theme(legend.position="right",
              axis.text = element_text(angle = 20, vjust = 0.6))
(j2a <- j2 + geom_point(aes(color = Data_Value),
                       alpha = 0.5,
                       size = 1.5,
                       position = position_jitter(width = 0.25, height = 0)))

j2a +
  scale_x_discrete(name="Gender") +
  scale_color_continuous(name="",
                         breaks = c(10, 40, 60),
                         labels = c("10", "40", "60"),
                         low = "blue", high = "red") +      ggtitle("Comparing Gender and Sample Size")

ggplotly()

include for young adults 18-44

5.3 Comparing Race/Ethnicity, Data Value, and Sample Size

j5 <- ggplot(All_Races,
             aes(x = `Race/Ethnicity`,
                 y = Sample_Size)) + 
        theme(legend.position="right",
              axis.text = element_text(angle = 20, vjust = 0.6))
(j5a <- j5 + geom_point(aes(color = Data_Value),
                       alpha = 0.5,
                       size = 1.5,
                       position = position_jitter(width = 0.25, height = 0)))

j5a +
  scale_x_discrete(name="Race/Ethnicity") +
  scale_color_continuous(name="",
                         breaks = c(10, 40, 60),
                         labels = c("10", "40", "60"),
                         low = "blue", high = "red") +      ggtitle("Comparing Race/Ethnicity and Sample Size")

ggplotly()

NA

5.4 Comparing Education, Data Value, and Sample Size

j6 <- ggplot(All_Edu,
             aes(x = `Education`,
                 y = Sample_Size)) + 
        theme(legend.position="right",
              axis.text = element_text(angle = 20, vjust = 0.6))
(j6a <- j6 + geom_point(aes(color = Data_Value),
                       alpha = 0.5,
                       size = 1.5,
                       position = position_jitter(width = 0.25, height = 0)))

j6a +
  scale_x_discrete(name="Education") +
  scale_color_continuous(name="",
                         breaks = c(10, 40, 60),
                         labels = c("10", "40", "60"),
                         low = "blue", high = "red") +      ggtitle("Comparing Education and Sample Size")

ggplotly()

NA

5.5 Focusing on Young Adults Age 18 - 44

j1 <- ggplot(filter(All_Ages, `Age(years)` %in% c("18 - 24", "25 - 34", "35 - 44")), aes(x = `Age(years)`,
                 y = Sample_Size)) + 
        theme(legend.position="right",
              axis.text = element_text(angle = 20, vjust = 0.6)) 
(j1a <- j1 + geom_point(aes(color = Data_Value),
                       alpha = 0.5,
                       size = 1.5,
                       position = position_jitter(width = 0.25, height = 0)))

j1a +
  scale_x_discrete(name="Age(years)") +
  scale_color_continuous(name="",
                         breaks = c(10, 40, 60),
                         labels = c("10", "40", "60"),
                         low = "blue", high = "red") +      ggtitle("Comparing Young Adults (18-44) and Sample Size")

ggplotly()

5.6 Focusing on Young Adults Age 18 - 44

j1 <- ggplot(filter(All_Ages, `Age(years)` %in% c("18 - 24", "25 - 34", "35 - 44")), aes(x = `Age(years)`,
                 y = Data_Value)) + 
        theme(legend.position="right",
              axis.text = element_text(angle = 20, vjust = 0.6)) 
(j1a <- j1 + geom_point(aes(color = Sample_Size),
                       alpha = 0.5,
                       size = 1.5,
                       position = position_jitter(width = 0.25, height = 0)))

j1a +
  scale_x_discrete(name="Age(years)") +
  scale_color_continuous(name="",
                         breaks = c(10, 40, 60),
                         labels = c("10", "40", "60"),
                         low = "blue", high = "red") +      ggtitle("Comparing Percentage and Young Adult (18-44)")

ggplotly()
LS0tCnRpdGxlOiAiRGF0YSBXcmFuZ2xpbmcgLSBGaW5hbCBQcm9qZWN0IgphdXRob3I6ICJKb3NodWEgT2xhYmlzaSAtIGBqb2xhYmlzaTc5NzVAZmxvcmlkYXBvbHkuZWR1YCIKb3V0cHV0OiAKICAgIGh0bWxfbm90ZWJvb2s6CiAgICAgICBudW1iZXJfc2VjdGlvbnM6IFRSVUUKICAgICAgIHRvYzogVFJVRQogICAgICAgdG9jX2Zsb2F0OiBUUlVFCi0tLQoKCiMgTG9hZGluZyBMaWJyYXJ5IGFuZCBSZWFkaW5nIHRoZSBEYXRhIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KHBsb3RseSkKCkNBUF9GSU5BTCA8LSByZWFkX2V4Y2VsKCJEb3dubG9hZHMvTnV0cml0aW9uX19QaHlzaWNhbF9BY3Rpdml0eV9fYW5kX09iZXNpdHlfLV9CZWhhdmlvcmFsX1Jpc2tfRmFjdG9yX1N1cnZlaWxsYW5jZV9TeXN0ZW0ueGxzeCIpCgpoZWFkKENBUF9GSU5BTCkKYGBgCgojIyBGaWx0ZXJpbmcgUXVlc3Rpb25zLCBBZ2VzLCBhbmQgR2VuZGVyIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQpgYGB7cn0KQWxsX0FnZXMxIDwtIENBUF9GSU5BTCAlPiUKICBmaWx0ZXIoUXVlc3Rpb24gPT0gIlBlcmNlbnQgb2YgYWR1bHRzIHdobyBlbmdhZ2UgaW4gbXVzY2xlLXN0cmVuZ3RoZW5pbmcgYWN0aXZpdGllcyBvbiAyIG9yIG1vcmUgZGF5cyBhIHdlZWsiKSAlPiUKICBmaWx0ZXIoYEFnZSh5ZWFycylgICVpbiUgYygiMTggLSAyNCIsICIyNSAtIDM0IiwgIjM1IC0gNDQiKSkKQWxsX0FnZXMxCmBgYAoKIyMgRmlsdGVyaW5nIFF1ZXN0aW9ucywgQWdlcywgYW5kIEdlbmRlciB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KYGBge3J9CkFsbF9HZW5kZXIxIDwtIENBUF9GSU5BTCAlPiUKICBmaWx0ZXIoUXVlc3Rpb24gPT0gIlBlcmNlbnQgb2YgYWR1bHRzIHdobyBlbmdhZ2UgaW4gbXVzY2xlLXN0cmVuZ3RoZW5pbmcgYWN0aXZpdGllcyBvbiAyIG9yIG1vcmUgZGF5cyBhIHdlZWsiKSAlPiUKICBmaWx0ZXIoYEdlbmRlcmAgJWluJSBjKCJGZW1hbGUiLCAiTWFsZSIpKQpBbGxfR2VuZGVyMQpgYGAKCiMjIEZpbHRlcmluZyBRdWVzdGlvbnMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CmBgYHtyfQpRIDwtIENBUF9GSU5BTCAlPiUKICBmaWx0ZXIoUXVlc3Rpb24gJWluJSBjKCJQZXJjZW50IG9mIGFkdWx0cyB3aG8gZW5nYWdlIGluIG11c2NsZS1zdHJlbmd0aGVuaW5nIGFjdGl2aXRpZXMgb24gMiBvciBtb3JlIGRheXMgYSB3ZWVrIiwgIlBlcmNlbnQgb2YgYWR1bHRzIHdobyBhY2hpZXZlIGF0IGxlYXN0IDE1MCBtaW51dGVzIGEgd2VlayBvZiBtb2RlcmF0ZS1pbnRlbnNpdHkgYWVyb2JpYyBwaHlzaWNhbCBhY3Rpdml0eSBvciA3NSBtaW51dGVzIGEgd2VlayBvZiB2aWdvcm91cy1pbnRlbnNpdHkgYWVyb2JpYyBhY3Rpdml0eSAob3IgYW4gZXF1aXZhbGVudCBjb21iaW5hdGlvbikiLCAiUGVyY2VudCBvZiBhZHVsdHMgd2hvIGFjaGlldmUgYXQgbGVhc3QgMzAwIG1pbnV0ZXMgYSB3ZWVrIG9mIG1vZGVyYXRlLWludGVuc2l0eSBhZXJvYmljIHBoeXNpY2FsIGFjdGl2aXR5IG9yIDE1MCBtaW51dGVzIGEgd2VlayBvZiB2aWdvcm91cy1pbnRlbnNpdHkgYWVyb2JpYyBhY3Rpdml0eSAob3IgYW4gZXF1aXZhbGVudCBjb21iaW5hdGlvbikiLCAiUGVyY2VudCBvZiBhZHVsdHMgd2hvIGVuZ2FnZSBpbiBubyBsZWlzdXJlLXRpbWUgcGh5c2ljYWwgYWN0aXZpdHkiKSkKUQpgYGAKCiMjIEZpbHRlcmluZyBRdWVzdGlvbiAxIGFuZCBFZHVjYXRpb25hbCBsZXZlbHMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CmBgYHtyfQpRMSA8LSBDQVBfRklOQUwgJT4lCiAgZmlsdGVyKFF1ZXN0aW9uID09ICJQZXJjZW50IG9mIGFkdWx0cyB3aG8gZW5nYWdlIGluIG11c2NsZS1zdHJlbmd0aGVuaW5nIGFjdGl2aXRpZXMgb24gMiBvciBtb3JlIGRheXMgYSB3ZWVrIikgJT4lCiAgZmlsdGVyKGBFZHVjYXRpb25gICVpbiUgYygiTGVzcyB0aGFuIGhpZ2ggc2Nob29sIiwgIkhpZ2ggc2Nob29sIGdyYWR1YXRlIiwgIlNvbWUgY29sbGVnZSBvciB0ZWNobmljYWwgc2Nob29sIiwgIkNvbGxlZ2UgZ3JhZHVhdGUiKSkKUTEKYGBgCgojIyBGaWx0ZXJpbmcgUXVlc3Rpb24gMiBhbmQgRWR1Y2F0aW9uYWwgbGV2ZWxzIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQpgYGB7cn0KUTIgPC0gQ0FQX0ZJTkFMICU+JQogIGZpbHRlcihRdWVzdGlvbiA9PSAiUGVyY2VudCBvZiBhZHVsdHMgd2hvIGFjaGlldmUgYXQgbGVhc3QgMTUwIG1pbnV0ZXMgYSB3ZWVrIG9mIG1vZGVyYXRlLWludGVuc2l0eSBhZXJvYmljIHBoeXNpY2FsIGFjdGl2aXR5IG9yIDc1IG1pbnV0ZXMgYSB3ZWVrIG9mIHZpZ29yb3VzLWludGVuc2l0eSBhZXJvYmljIGFjdGl2aXR5IChvciBhbiBlcXVpdmFsZW50IGNvbWJpbmF0aW9uKSIpICU+JQogIGZpbHRlcihgRWR1Y2F0aW9uYCAlaW4lIGMoIkxlc3MgdGhhbiBoaWdoIHNjaG9vbCIsICJIaWdoIHNjaG9vbCBncmFkdWF0ZSIsICJTb21lIGNvbGxlZ2Ugb3IgdGVjaG5pY2FsIHNjaG9vbCIsICJDb2xsZWdlIGdyYWR1YXRlIikpClEyCiAgCmBgYAoKIyMgRmlsdGVyaW5nIFF1ZXN0aW9uIDMgYW5kIEVkdWNhdGlvbmFsIGxldmVscyB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KYGBge3J9ClEzIDwtIENBUF9GSU5BTCAlPiUKICBmaWx0ZXIoUXVlc3Rpb24gPT0gIlBlcmNlbnQgb2YgYWR1bHRzIHdobyBhY2hpZXZlIGF0IGxlYXN0IDMwMCBtaW51dGVzIGEgd2VlayBvZiBtb2RlcmF0ZS1pbnRlbnNpdHkgYWVyb2JpYyBwaHlzaWNhbCBhY3Rpdml0eSBvciAxNTAgbWludXRlcyBhIHdlZWsgb2Ygdmlnb3JvdXMtaW50ZW5zaXR5IGFlcm9iaWMgYWN0aXZpdHkgKG9yIGFuIGVxdWl2YWxlbnQgY29tYmluYXRpb24pIikgJT4lCiAgZmlsdGVyKGBFZHVjYXRpb25gICVpbiUgYygiTGVzcyB0aGFuIGhpZ2ggc2Nob29sIiwgIkhpZ2ggc2Nob29sIGdyYWR1YXRlIiwgIlNvbWUgY29sbGVnZSBvciB0ZWNobmljYWwgc2Nob29sIiwgIkNvbGxlZ2UgZ3JhZHVhdGUiKSkKUTMKYGBgCgojIyBGaWx0ZXJpbmcgUXVlc3Rpb24gNCBhbmQgRWR1Y2F0aW9uYWwgbGV2ZWxzIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQpgYGB7cn0KUTQgPC0gQ0FQX0ZJTkFMICU+JQogIGZpbHRlcihRdWVzdGlvbiA9PSAiUGVyY2VudCBvZiBhZHVsdHMgd2hvIGVuZ2FnZSBpbiBubyBsZWlzdXJlLXRpbWUgcGh5c2ljYWwgYWN0aXZpdHkiKSAlPiUKICBmaWx0ZXIoYEVkdWNhdGlvbmAgJWluJSBjKCJMZXNzIHRoYW4gaGlnaCBzY2hvb2wiLCAiSGlnaCBzY2hvb2wgZ3JhZHVhdGUiLCAiU29tZSBjb2xsZWdlIG9yIHRlY2huaWNhbCBzY2hvb2wiLCAiQ29sbGVnZSBncmFkdWF0ZSIpKQpRNApgYGAKCgojIENvbXBhcmluZyBlYWNoIFF1ZXN0aW9uLCBQZXJjZW50YWdlIChEYXRhIFZhbHVlKSwgYW5kIFNhbXBsZSBTaXplIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQpgYGB7cn0KZ2dwbG90KFEsIGFlcyh4PSBzdHJfd3JhcChgUXVlc3Rpb25gLCB3aWR0aCA9IDEwKSwgeT1gRGF0YV9WYWx1ZWAsIGZpbGwgPSBgU2FtcGxlX1NpemVgKSkgKyAKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJyaWdodCIpICsKICB4bGFiKCJRdWVzdGlvbiIpICsgeWxhYigiUGVyY2VudGFnZSIpICsgZ2d0aXRsZSgiQ29tcGFyaW5nIEFsbCBFZHVjYXRpb25hbCBMZXZlbHMsIFBlcmNlbnRhZ2UsIGFuZCBTYW1wbGUgU2l6ZSIpCiAgICAgICAgICAgICAgCmdncGxvdGx5KHRvb2x0aXAgPSBjKCJ5IiwgImZpbGwiKSkKYGBgCgojIyBDb21wYXJpbmcgUXVlc3Rpb24gMSwgRWR1Y2F0aW9uYWwgTGV2ZWxzLCBQZXJjZW50YWdlIChEYXRhIFZhbHVlKSwgYW5kIFNhbXBsZSBTaXplIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQpgYGB7cn0KZ2dwbG90KFExLCBhZXMoeD0gc3RyX3dyYXAoYEVkdWNhdGlvbmAsIHdpZHRoID0gMTApLCB5PWBEYXRhX1ZhbHVlYCwgZmlsbCA9IGBTYW1wbGVfU2l6ZWApKSArIAogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArICB0aGVtZShsZWdlbmQucG9zaXRpb249InJpZ2h0IikgKwogIHhsYWIoIkVkdWNhdGlvbiIpICsgeWxhYigiUGVyY2VudGFnZSIpICsgZ2d0aXRsZSgiQ29tcGFyaW5nIEVkdWNhdGlvbmFsIExldmVscywgUGVyY2VudGFnZSwgYW5kIFNhbXBsZSBTaXplIikKICAgICAgICAgICAgICAKZ2dwbG90bHkodG9vbHRpcCA9IGMoInkiLCAiZmlsbCIpKQpgYGAKCiMjIyBDb21wYXJpbmcgUXVlc3Rpb24gMSwgRWR1Y2F0aW9uYWwgTGV2ZWxzLCBQZXJjZW50YWdlIChEYXRhIFZhbHVlKSwgYW5kIFNhbXBsZSBTaXplIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQpgYGB7cn0KZ2dwbG90KEFsbF9HZW5kZXIxLCBhZXMoeD0gYFNhbXBsZV9TaXplYCwgeT1gRGF0YV9WYWx1ZWAsIGZpbGwgPSBgUXVlc3Rpb25gKSkgKyAKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJ0b3AiLAogICAgICAgICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDEwLCB2anVzdCA9IDAuNikpICsKICB4bGFiKCJTYW1wbGUgU2l6ZSIpICsgeWxhYigiUGVyY2VudGFnZSIpICsgZ2d0aXRsZSgiUGVyY2VudCBvZiBhZHVsdHMgd2hvIGVuZ2FnZSBpbiBtdXNjbGUtc3RyZW5ndGhlbmluZyBhY3Rpdml0aWVzIikKZ2dwbG90bHkoKQpgYGAKCiMjIENvbXBhcmluZyBRdWVzdGlvbiAyLCBFZHVjYXRpb25hbCBMZXZlbHMsIFBlcmNlbnRhZ2UgKERhdGEgVmFsdWUpLCBhbmQgU2FtcGxlIFNpemUgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CmBgYHtyfQpnZ3Bsb3QoUTIsIGFlcyh4PSBzdHJfd3JhcChgRWR1Y2F0aW9uYCwgd2lkdGggPSAxMCksIHk9YERhdGFfVmFsdWVgLCBmaWxsID0gYFNhbXBsZV9TaXplYCkpICsgCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0icmlnaHQiKSArCiAgeGxhYigiRWR1Y2F0aW9uIikgKyB5bGFiKCJQZXJjZW50YWdlIikgKyBnZ3RpdGxlKCJDb21wYXJpbmcgRWR1Y2F0aW9uYWwgTGV2ZWxzLCBQZXJjZW50YWdlLCBhbmQgU2FtcGxlIFNpemUiKQogICAgICAgICAgICAgIApnZ3Bsb3RseSh0b29sdGlwID0gYygieSIsICJmaWxsIikpCmBgYAoKIyMgQ29tcGFyaW5nIFF1ZXN0aW9uIDMsIEVkdWNhdGlvbmFsIExldmVscywgUGVyY2VudGFnZSAoRGF0YSBWYWx1ZSksIGFuZCBTYW1wbGUgU2l6ZSB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KYGBge3J9CmdncGxvdChRMywgYWVzKHg9IHN0cl93cmFwKGBFZHVjYXRpb25gLCB3aWR0aCA9IDEwKSwgeT1gRGF0YV9WYWx1ZWAsIGZpbGwgPSBgU2FtcGxlX1NpemVgKSkgKyAKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJyaWdodCIpICsKICB4bGFiKCJFZHVjYXRpb24iKSArIHlsYWIoIlBlcmNlbnRhZ2UiKSArIGdndGl0bGUoIkNvbXBhcmluZyBFZHVjYXRpb25hbCBMZXZlbHMsIFBlcmNlbnRhZ2UsIGFuZCBTYW1wbGUgU2l6ZSIpCiAgICAgICAgICAgICAgCmdncGxvdGx5KHRvb2x0aXAgPSBjKCJ5IiwgImZpbGwiKSkKYGBgCgojIyBDb21wYXJpbmcgUXVlc3Rpb24gNCwgRWR1Y2F0aW9uYWwgTGV2ZWxzLCBQZXJjZW50YWdlIChEYXRhIFZhbHVlKSwgYW5kIFNhbXBsZSBTaXplIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQpgYGB7cn0KZ2dwbG90KFE0LCBhZXMoeD0gc3RyX3dyYXAoYEVkdWNhdGlvbmAsIHdpZHRoID0gMTApLCB5PWBEYXRhX1ZhbHVlYCwgZmlsbCA9IGBTYW1wbGVfU2l6ZWApKSArIAogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArICB0aGVtZShsZWdlbmQucG9zaXRpb249InJpZ2h0IikgKwogIHhsYWIoIkVkdWNhdGlvbiIpICsgeWxhYigiUGVyY2VudGFnZSIpICsgZ2d0aXRsZSgiQ29tcGFyaW5nIEVkdWNhdGlvbmFsIExldmVscywgUGVyY2VudGFnZSwgYW5kIFNhbXBsZSBTaXplIikKICAgICAgICAgICAgICAKZ2dwbG90bHkodG9vbHRpcCA9IGMoInkiLCAiZmlsbCIpKQpgYGAKCgojIENvbWJpbmluZyBBZ2dyZWdhcmVkIERhdGEgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CiMjIEFsbCBBZ2VzCgpgYGB7cn0KQWxsX0FnZXMgPC0gQ0FQX0ZJTkFMICU+JSAKICBmaWx0ZXIoYEFnZSh5ZWFycylgICVpbiUgYygiMTggLSAyNCIsICIyNSAtIDM0IiwgIjM1IC0gNDQiLCAiNDUgLSA1NCIsICI1NSAtIDY0IiwgIjY1IG9yIG9sZGVyIikpCmhlYWQoQWxsX0FnZXMpCmBgYAoKIyMgQWxsIEVkdWNhdGlvbgpgYGB7cn0KQWxsX0VkdSA8LSBDQVBfRklOQUwgJT4lCiAgZmlsdGVyKGBFZHVjYXRpb25gICVpbiUgYygiTGVzcyB0aGFuIGhpZ2ggc2Nob29sIiwgIkhpZ2ggc2Nob29sIGdyYWR1YXRlIiwgIlNvbWUgY29sbGVnZSBvciB0ZWNobmljYWwgc2Nob29sIiwgIkNvbGxlZ2UgZ3JhZHVhdGUiKSkKaGVhZChBbGxfRWR1KQpgYGAKCiMjIEFsbCBHZW5kZXIKYGBge3J9CkFsbF9HZW5kZXIgPC0gQ0FQX0ZJTkFMICU+JQogIGZpbHRlcihgR2VuZGVyYCAlaW4lIGMoIkZlbWFsZSIsICJNYWxlIikpCmhlYWQoQWxsX0dlbmRlcikKYGBgCgojIyBBbGwgSW5jb21lCmBgYHtyfQpBbGxfSW5jb21lIDwtIENBUF9GSU5BTCAlPiUKICBmaWx0ZXIoYEluY29tZWAgJWluJSBjKCJMZXNzIHRoYW4gJDE1LDAwMCIsICIkMTUsMDAwIC0gJDI0LDk5OSIsICIkMjUsMDAwIC0gJDM0LDk5OSIsICIkMzUsMDAwIC0gJDQ5LDk5OSIsICIkNTAsMDAwIC0gJDc0LDk5OSIsICIkNzUsMDAwIG9yIGdyZWF0ZXIiKSkKaGVhZChBbGxfSW5jb21lKQpgYGAKCiMjIEFsbCBSYWNlL0V0aG5pY2l0eQpgYGB7cn0KQWxsX1JhY2VzIDwtIENBUF9GSU5BTCAlPiUKICBmaWx0ZXIoYFJhY2UvRXRobmljaXR5YCAlaW4lIGMoIkFtZXJpY2FuIEluZGlhbi9BbGFza2EgTmF0aXZlIiwgIkFzaWFuIiwgIkhhd2FpaWFuL1BhY2lmaWMgSXNsYW5kZXIiLCAiTm9uLUhpc3BhbmljIEJsYWNrIiwgIk5vbi1IaXNwYW5pYyBXaGl0ZSIsICJIaXNwYW5pYyIsICIyIG9yIG1vcmUgcmFjZXMiKSkKaGVhZChBbGxfUmFjZXMpCmBgYAoKIyMgQWdlIDE4LTI0CmBgYHtyfQpBZ2UgPC0gQ0FQX0ZJTkFMICU+JQogIGZpbHRlcihgQWdlKHllYXJzKWAgJWluJSAiMTggLSAyNCIpCmhlYWQoQWdlKQpgYGAKCiMgVmlzdWFsaXphdGlvbiBmb3IgQWxsIEFnZXMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CiMjIEJveHBsb3QgZm9yIEFsbCBBZ2VzCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IEFsbF9BZ2VzLCAKICAgICAgIGFlcyh4PXJlb3JkZXIoYEFnZSh5ZWFycylgLCBgRGF0YV9WYWx1ZWApLCB5PWBEYXRhX1ZhbHVlYCwgZmlsbD1gU2FtcGxlX1NpemVgLCBjb2xvciA9ICJBZ2UoeWVhcnMpIikpICsgCiAgZ2VvbV9ib3hwbG90KCkgKyB4bGFiKCJBZ2UoeWVhcnMpIikgKyB5bGFiKCJQZXJjZW50YWdlIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0idG9wIikgKyBnZ3RpdGxlKCJCb3hwbG90IGZvciBBbGwgQWdlcyIpCmdncGxvdGx5KCkKYGBgCgojIyBBbGwgQWdlcyBhbmQgU2FtcGxlIFNpemUgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CmBgYHtyfQpqMSA8LSBnZ3Bsb3QoZGF0YSA9IEFsbF9BZ2VzLCAKICBhZXMoeCA9IGBBZ2UoeWVhcnMpYCwgeSA9IERhdGFfVmFsdWUsIGNvbG9yID0gYFNhbXBsZV9TaXplYCkpICsKICBnZW9tX3BvaW50KHN0YXQgPSAiSWRlbnRpdHkiLCBmaWxsID0gIiM1MzJkOGUiKSArIAogIHhsYWIoIkFnZSh5ZWFycykiKSArIHlsYWIoIlBlcmNlbnRhZ2UiKSArIGdndGl0bGUoIkNvbXBhcmluZyBBbGwgQWdlcyBhbmQgU2FtcGxlIFNpemUiKQpqMQpnZ3Bsb3RseShqMSkKYGBgCgoKIyBEYXRhIEFuYWx5c2lzIGFuZCBWaXN1YWxpemF0aW9uIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQojIyBDb21wYXJpbmcgSW5jb21lLCBEYXRhIFZhbHVlLCBhbmQgU2FtcGxlIFNpemUgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CmBgYHtyfQpqMyA8LSBnZ3Bsb3QoQWxsX0luY29tZSwKICAgICAgICAgICAgIGFlcyh4ID0gSW5jb21lLAogICAgICAgICAgICAgICAgIHkgPSBTYW1wbGVfU2l6ZSkpICsgCiAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJyaWdodCIsCiAgICAgICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMjAsIHZqdXN0ID0gMC42KSkKKGo0IDwtIGozICsgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBEYXRhX1ZhbHVlKSwKICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMS41LAogICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoID0gMC4yNSwgaGVpZ2h0ID0gMCkpKQpqNCArCiAgc2NhbGVfeF9kaXNjcmV0ZShuYW1lPSJJbmNvbWUiKSArCiAgc2NhbGVfY29sb3JfY29udGludW91cyhuYW1lPSIiLAogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygxMCwgNDAsIDYwKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIjEwIiwgIjQwIiwgIjYwIiksCiAgICAgICAgICAgICAgICAgICAgICAgICBsb3cgPSAiYmx1ZSIsIGhpZ2ggPSAicmVkIikgKyAgICAgIGdndGl0bGUoIkNvbXBhcmluZyBJbmNvbWUgYW5kIFNhbXBsZSBTaXplIikKZ2dwbG90bHkoKQpgYGAKCiMjIENvbXBhcmluZyBHZW5kZXIsIERhdGEgdmFsdWUsIGFuZCBTYW1wbGUgU2l6ZSB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KYGBge3J9CmoyIDwtIGdncGxvdChBbGxfR2VuZGVyLAogICAgICAgICAgICAgYWVzKHggPSBHZW5kZXIsCiAgICAgICAgICAgICAgICAgeSA9IFNhbXBsZV9TaXplKSkgKyAKICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb249InJpZ2h0IiwKICAgICAgICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoYW5nbGUgPSAyMCwgdmp1c3QgPSAwLjYpKQooajJhIDwtIGoyICsgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBEYXRhX1ZhbHVlKSwKICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMS41LAogICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoID0gMC4yNSwgaGVpZ2h0ID0gMCkpKQpqMmEgKwogIHNjYWxlX3hfZGlzY3JldGUobmFtZT0iR2VuZGVyIikgKwogIHNjYWxlX2NvbG9yX2NvbnRpbnVvdXMobmFtZT0iIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMTAsIDQwLCA2MCksCiAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCIxMCIsICI0MCIsICI2MCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgbG93ID0gImJsdWUiLCBoaWdoID0gInJlZCIpICsgICAgICBnZ3RpdGxlKCJDb21wYXJpbmcgR2VuZGVyIGFuZCBTYW1wbGUgU2l6ZSIpCmdncGxvdGx5KCkKYGBgCgppbmNsdWRlIGZvciB5b3VuZyBhZHVsdHMgMTgtNDQKCiMjIENvbXBhcmluZyBSYWNlL0V0aG5pY2l0eSwgRGF0YSBWYWx1ZSwgYW5kIFNhbXBsZSBTaXplIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQpgYGB7cn0KajUgPC0gZ2dwbG90KEFsbF9SYWNlcywKICAgICAgICAgICAgIGFlcyh4ID0gYFJhY2UvRXRobmljaXR5YCwKICAgICAgICAgICAgICAgICB5ID0gU2FtcGxlX1NpemUpKSArIAogICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0icmlnaHQiLAogICAgICAgICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDIwLCB2anVzdCA9IDAuNikpCihqNWEgPC0gajUgKyBnZW9tX3BvaW50KGFlcyhjb2xvciA9IERhdGFfVmFsdWUpLAogICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41LAogICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAxLjUsCiAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGggPSAwLjI1LCBoZWlnaHQgPSAwKSkpCmo1YSArCiAgc2NhbGVfeF9kaXNjcmV0ZShuYW1lPSJSYWNlL0V0aG5pY2l0eSIpICsKICBzY2FsZV9jb2xvcl9jb250aW51b3VzKG5hbWU9IiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDEwLCA0MCwgNjApLAogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiMTAiLCAiNDAiLCAiNjAiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxvdyA9ICJibHVlIiwgaGlnaCA9ICJyZWQiKSArICAgICAgZ2d0aXRsZSgiQ29tcGFyaW5nIFJhY2UvRXRobmljaXR5IGFuZCBTYW1wbGUgU2l6ZSIpCmdncGxvdGx5KCkKCmBgYAoKIyMgQ29tcGFyaW5nIEVkdWNhdGlvbiwgRGF0YSBWYWx1ZSwgYW5kIFNhbXBsZSBTaXplIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQpgYGB7cn0KajYgPC0gZ2dwbG90KEFsbF9FZHUsCiAgICAgICAgICAgICBhZXMoeCA9IGBFZHVjYXRpb25gLAogICAgICAgICAgICAgICAgIHkgPSBTYW1wbGVfU2l6ZSkpICsgCiAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJyaWdodCIsCiAgICAgICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMjAsIHZqdXN0ID0gMC42KSkKKGo2YSA8LSBqNiArIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gRGF0YV9WYWx1ZSksCiAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUsCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDEuNSwKICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aCA9IDAuMjUsIGhlaWdodCA9IDApKSkKajZhICsKICBzY2FsZV94X2Rpc2NyZXRlKG5hbWU9IkVkdWNhdGlvbiIpICsKICBzY2FsZV9jb2xvcl9jb250aW51b3VzKG5hbWU9IiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDEwLCA0MCwgNjApLAogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiMTAiLCAiNDAiLCAiNjAiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxvdyA9ICJibHVlIiwgaGlnaCA9ICJyZWQiKSArICAgICAgZ2d0aXRsZSgiQ29tcGFyaW5nIEVkdWNhdGlvbiBhbmQgU2FtcGxlIFNpemUiKQpnZ3Bsb3RseSgpCgpgYGAKCgojIyBGb2N1c2luZyBvbiBZb3VuZyBBZHVsdHMgQWdlIDE4IC0gNDQgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CmBgYHtyfQpqMSA8LSBnZ3Bsb3QoZmlsdGVyKEFsbF9BZ2VzLCBgQWdlKHllYXJzKWAgJWluJSBjKCIxOCAtIDI0IiwgIjI1IC0gMzQiLCAiMzUgLSA0NCIpKSwgYWVzKHggPSBgQWdlKHllYXJzKWAsCiAgICAgICAgICAgICAgICAgeSA9IFNhbXBsZV9TaXplKSkgKyAKICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb249InJpZ2h0IiwKICAgICAgICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoYW5nbGUgPSAyMCwgdmp1c3QgPSAwLjYpKSAKKGoxYSA8LSBqMSArIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gRGF0YV9WYWx1ZSksCiAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUsCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDEuNSwKICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aCA9IDAuMjUsIGhlaWdodCA9IDApKSkKajFhICsKICBzY2FsZV94X2Rpc2NyZXRlKG5hbWU9IkFnZSh5ZWFycykiKSArCiAgc2NhbGVfY29sb3JfY29udGludW91cyhuYW1lPSIiLAogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygxMCwgNDAsIDYwKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIjEwIiwgIjQwIiwgIjYwIiksCiAgICAgICAgICAgICAgICAgICAgICAgICBsb3cgPSAiYmx1ZSIsIGhpZ2ggPSAicmVkIikgKyAgICAgIGdndGl0bGUoIkNvbXBhcmluZyBZb3VuZyBBZHVsdHMgKDE4LTQ0KSBhbmQgU2FtcGxlIFNpemUiKQpnZ3Bsb3RseSgpCmBgYAoKIyMgRm9jdXNpbmcgb24gWW91bmcgQWR1bHRzIEFnZSAxOCAtIDQ0IHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQpgYGB7cn0KajEgPC0gZ2dwbG90KGZpbHRlcihBbGxfQWdlcywgYEFnZSh5ZWFycylgICVpbiUgYygiMTggLSAyNCIsICIyNSAtIDM0IiwgIjM1IC0gNDQiKSksIGFlcyh4ID0gYEFnZSh5ZWFycylgLAogICAgICAgICAgICAgICAgIHkgPSBEYXRhX1ZhbHVlKSkgKyAKICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb249InJpZ2h0IiwKICAgICAgICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoYW5nbGUgPSAyMCwgdmp1c3QgPSAwLjYpKSAKKGoxYSA8LSBqMSArIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gU2FtcGxlX1NpemUpLAogICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41LAogICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAxLjUsCiAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGggPSAwLjI1LCBoZWlnaHQgPSAwKSkpCmoxYSArCiAgc2NhbGVfeF9kaXNjcmV0ZShuYW1lPSJBZ2UoeWVhcnMpIikgKwogIHNjYWxlX2NvbG9yX2NvbnRpbnVvdXMobmFtZT0iIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMTAsIDQwLCA2MCksCiAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCIxMCIsICI0MCIsICI2MCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgbG93ID0gImJsdWUiLCBoaWdoID0gInJlZCIpICsgICAgICBnZ3RpdGxlKCJDb21wYXJpbmcgUGVyY2VudGFnZSBhbmQgWW91bmcgQWR1bHQgKDE4LTQ0KSIpCmdncGxvdGx5KCkKYGBgCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo=